//
// Created by Crev on 24-6-3.
//

#ifndef LRMAP_H
#define LRMAP_H
#include <map>

#include "LRNode.h"
#include "Production.h"


class LRMap {
public:
    LRMap(){}; // [GUI CHANGES] 添加无参构造，因为需要成为界面的成员变量
    LRMap(vector<Production> productions, const map<string, Character*>& nameToCharacter,
          const map<string, vector<Production>>& nameToProductions, const bool& isLA = false);
    void showMap() const; // 打印构造出来的DFA图
    void showTable() const; // 打印DFA表格
    vector<map<string, string>> tableMap; // 等价于table的分析表，列使用map映射存储
    vector<Production> productions; // 所有的文法语句
    set<string> allEndCharNames; // 所有文法中的终结符符号的名字集合

    vector<LRNode*> allNodes; // DFA图中的所有节点
    vector<Character*> allChars; // 所有文法中的符号
    vector<vector<string>> table; // DFA表格/LALR(1)分析表
    // ^^^[GUI CHANGES] 公开这些成员变量，用于GUI点的内容和分析表的展示

private:
    void buildMap(); // 初始化LR(1)DFA图/LALR(1)DFA图
    void initAllChars(); // 初始化allChars成员变量
    void initTable(); // 初始化DFA表格/LALR(1)分析表
    vector<Production> generateAllProductionsFrom(const vector<Production>& originProductions);
    // ^^^由一组文法语句(productions)引发其他文法语句的引入，返回最后的所有文法语句，用于DFA节点内容的生成
    bool isLA; // 是否为LALR(1)，否则是LR(1)
    vector<LREdge*> allEdges; // DFA图中的所有边
    map<string, Character*> nameToCharacter; // 用名称字符映射到对应的Character实例
    map<string, vector<Production>> nameToProductions; // 用名称字符(非终结符)映射到对应的文法语句列表
    map<string, LRNode*> pStringToNode; // DFA节点中所有文法语句拼接出的字符串到该DFA节点的映射
};


#endif //LRMAP_H
